Spring cloud Gateway 路由容错


路由容错控制器的主要的运用场景就是在遇到超时、服务器端错误来发挥作用,通过 Gateway 来集成 Hystrix(含 resilience4j)通过过滤器来加入 fallbackUri 得以实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

import java.util.HashMap;
import java.util.Map;

/**
* 容错控制器
*
* @author kunlun
* @date 2021/7/16
*/
@RestController
public class NotFoundController {


@RequestMapping(value = "/fallback")
public Mono<Map<String, String>> notFound() {
Map<String, String> stringMap = new HashMap<>();
stringMap.put("code", "503");
stringMap.put("data", "Current service is unavailable");
stringMap.put("gateway", "GatewayConfigurationFaultToleranceRouting");
return Mono.just(stringMap);
}
}

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
spring:
application:
name: GatewayConfigurationFaultToleranceRouting
cloud:
gateway:
routes:
- id: hey
uri: lb://service-provider/hey
predicates:
- Path=/hey
- Method=GET
filters:
- AddRequestParameter=name,key
# 服务熔断后使用的地址 @RequestMapping(value = "/fallback")
- name: CircuitBreaker
args:
name: fallback
fallbackUri: forward:/fallback
discovery:
locator:
# 允许服务发现
enabled: true
consul:
host: localhost
port: 8500
discovery:
service-name: service-provider

server:
port: 8210

需要注意的是由于我们这个是熔断,需要服务提供者的存在,因此你可以将服务提供者快速关闭来达到他短时间无法提供服务,之后网关才可认定这是由于服务出错导致的,如果直接关闭服务提供者那返回的只是 404

最后启动 consul 集群以及服务提供者,通过 GET 方式请求 http://localhost/hey 即可完成路由容错控制器的实现,当然你也可以直接通过 lb://service-provider 来进行配置你的服务路由。

本文使用《江雪分析公开知识存储库知识共享许可证》进行发布